package auctionatr

import grails.plugin.mail.MailService

import java.util.Map

import org.codehaus.groovy.grails.commons.ConfigurationHolder


class SendEmailService {

	static transactional = true
	MailService mailService
	def messageSource

	/**
	 * Sendet eine Email, um einen Auktionsgewinner zu benachrichtigen.
	 * Die Map email enthält folgende Felder:
	 * <ul>
	 * <li> email - Email-Adresse des Empfängers </li>
	 * <li> name - Name des Empfängers </li>
	 * <li> auction - Titel der Auktion </li>
	 * <li> bid - Endpreis</li>
	 * </ul>
	 * @param email
	 * @return
	 */
	def sendEmailWhenAuctionWon (Map email) {

		// Check, ob Mailversand aktiviert:
		if(ConfigurationHolder.config.activateMail == true) {

			String [] bodyargs = [
				email.get('name').toString(),
				email.get('auction').toString(),
				email.get('bid').toString()
			]
			String bodyc = messageSource.resolveCode("mail.auctionWon.body", new java.util.Locale("de")).format(bodyargs)


			String [] subjectargs = [
				email.get('auction').toString()
			]
			String subjectc = messageSource.resolveCode("mail.auctionWon.subject", new java.util.Locale("de")).format(subjectargs)

			runAsync {
				// Mail versenden:
				try {
					mailService.sendMail {
						to email.get("email").toString()
						subject subjectc
						body bodyc
					}
					// falls Mailversand gescheitert (bspw. Mailserver nicht erreichbar), lediglich Fehlermeldung in Konsole anzeigen:
				} catch (Exception e) {
					println "Mail could not be sent."
					println e.stackTrace
					println e.getCause()
				}
			}
		}
	}

	/**
	 * Sendet eine Email, um den Verkaeufer ueber das Ende der Auktion zu benachrichtigen (wenn Gebot vorhanden).
	 * Die Map email enthÃ¤lt folgende Felder:
	 * <ul>
	 * <li> email - Email-Adresse des EmpfÃ¤ngers </li>
	 * <li> name - Name des EmpfÃ¤ngers </li>
	 * <li> auction - Titel der Auktion </li>
	 * <li> bid - Endpreis</li>
	 * <li> bidder - KÃ¤ufer </li>
	 * </ul>
	 * @param email
	 * @return
	 */
	def sendEmailToSellerWhenAuctionFinished (Map email) {
		// Check, ob Mailversand aktiviert:
		if(ConfigurationHolder.config.activateMail == true) {

			String [] bodyargs = [
				email.get('name').toString(),
				email.get('auction').toString(),
				email.get('bid').toString(),
				email.get('bidder').toString()
			]
			String bodyc = messageSource.resolveCode("mail.toSellerWhenFinished.body", new java.util.Locale("de")).format(bodyargs)


			String [] subjectargs = [
				email.get('auction').toString()
			]
			String subjectc = messageSource.resolveCode("mail.toSellerWhenFinished.subject", new java.util.Locale("de")).format(subjectargs)


			runAsync {
				// Mail versenden:
				try {
					mailService.sendMail {
						to email.get("email").toString()
						subject subjectc
						body bodyc
					}
					// falls Mailversand gescheitert (bspw. Mailserver nicht erreichbar), lediglich Fehlermeldung in Konsole anzeigen:
				} catch (Exception e) {
					println "Mail could not be sent."
					println e.stackTrace
					println e.getCause()
				}
			}
		}
	}
	
	/**
	* Sendet eine Email, um den Verkaeufer das Ende der Auktion zu benachrichtigen (wenn kein Gebot vorhanden).
	* Die Map email enthaelt folgende Felder:
	* <ul>
	* <li> email - Email-Adresse des EmpfÃ¤ngers </li>
	* <li> name - Name des EmpfÃ¤ngers </li>
	* <li> auction - Titel der Auktion </li>
	* <li> bid - Endpreis</li>
	* <li> bidder - KÃ¤ufer </li>
	* </ul>
	* @param email
	* @return
	*/
   def sendEmailToSellerWhenAuctionFinishedWithoutBid (Map email) {
	   // Check, ob Mailversand aktiviert:
	   if(ConfigurationHolder.config.activateMail == true) {

		   String [] bodyargs = [
			   email.get('name').toString(),
			   email.get('auction').toString()
		   ]
		   String bodyc = messageSource.resolveCode("mail.toSellerWhenFinishedWithoutBid.body", new java.util.Locale("de")).format(bodyargs)


		   String [] subjectargs = [
			   email.get('auction').toString()
		   ]
		   String subjectc = messageSource.resolveCode("mail.toSellerWhenFinishedWithoutBid.subject", new java.util.Locale("de")).format(subjectargs)


		   runAsync {
			   // Mail versenden:
			   try {
				   mailService.sendMail {
					   to email.get("email").toString()
					   subject subjectc
					   body bodyc
				   }
				   // falls Mailversand gescheitert (bspw. Mailserver nicht erreichbar), lediglich Fehlermeldung in Konsole anzeigen:
			   } catch (Exception e) {
				   println "Mail could not be sent."
				   println e.stackTrace
				   println e.getCause()
			   }
		   }
	   }
   }

	/**
	 * Sendet eine Email, wenn man nicht mehr Meistbietender ist.
	 * Die Map email enthÃ¤lt folgende Felder:
	 * <ul>
	 * <li> email - Email-Adresse des EmpfÃ¤ngers </li>
	 * <li> name - Name des EmpfÃ¤ngers </li>
	 * <li> auction - Titel der Auktion </li>
	 * <li> bid - neuer Preis</li>
	 * <li> bidder - neuer Meistbietender </li>
	 * </ul>
	 * @param email
	 * @return
	 */
	def sendEmailWhenNotHighestBidderAnymore (Map email) {
		// Check, ob Mailversand aktiviert:
		if(ConfigurationHolder.config.activateMail == true) {

			String [] bodyargs = [
				email.get('name').toString(),
				email.get('bidder').toString(),
				email.get('auction').toString(),
				email.get('bid').toString()
			]
			String bodyc = messageSource.resolveCode("mail.toSellerWhenFinished.body", new java.util.Locale("de")).format(bodyargs)

			String [] subjectargs = [
				email.get('auction').toString()
			]
			String subjectc = messageSource.resolveCode("mail.toSellerWhenFinished.subject", new java.util.Locale("de")).format(subjectargs)


			runAsync {
				// Mail versenden:
				try {
					mailService.sendMail {
						to email.get("email").toString()
						subject subjectc
						body bodyc
					}
					// falls Mailversand gescheitert (bspw. Mailserver nicht erreichbar), lediglich Fehlermeldung in Konsole anzeigen:
				} catch (Exception e) {
					println "Mail could not be sent."
					println e.stackTrace
					println e.getCause()
				}
			}
		}
	}
}
